/**
 * 1. Promise就是一个类，在执行这个类时， 需要传递一个执行器进去，执行器会立即执行
 * 2. Promise 中有三个状态： 分别是 成功 fulfilled； 失败 rejected；等待 pending
 *      pending --> fulfilled
 *      pending --> rejected
 *      一旦状态确定就不能更改
 * 3. resolve和reject函数就是用来更改状态的
 *      resolve： fulfilled
 *      reject： rejected
 * 4. then方法内部所做的事情就是判断状态， 如果状态成功调用成功的回调函数， 如果状态失败，调用失败的回调函数， then方法是被定义在原型对象中的
 * 5. then成功回调有一个成功参数， 失败回调有一个失败原因参数
 * 6. 处理异步的情况
 * 7. 处理多个then的情况
 * 8. 处理then方法的链式调用--同步调用
 * 9. 处理then方法的链式调用--异步调用
 * 10. 处理then方法里面不传resolve和reject函数的处理方法， 默认传入方法
 * 11. Promise.all方法的实现
 */
const MyPromise = require("./myPromise.js");
let promsie = new MyPromise((resolve, reject) => {
  // throw new Error("执行器错误");
  // resolve("成功");
  // reject("失败");
  setTimeout(() => {
    resolve("异步成功");
  }, 2000);
});

// promsie.then(
//   (value) => {
//     console.log(value);
//   },
//   (reason) => {
//     console.log(reason);
//   }
// );

// promsie.then((value) => console.log(value));
// promsie.then((value) => console.log(value));
// promsie.then((value) => console.log(value));

function other() {
  return new MyPromise((resolve, reject) => {
    resolve("other");
  });
}

// promsie
//   .then((value) => {
//     console.log(value);
//     return other();
//   })
//   .then((value) => {
//     console.log(value);
//   });

let p1 = promsie.then(
  (value) => {
    // throw new Error("执行器错误");
    console.log(value);
    return "aaa";
    // throw new Error("执行器错误");
    // return p1;
  },
  (err) => {
    throw new Error("执行器错误reject");
    console.log(err);
  }
);

p1.then(
  (value) => {
    console.log(value);
  },
  (reason) => {
    console.log("报错了");
    console.log(reason);
  }
);
// .catch((err) => {
//   console.log(err);
// });

// 示例 Promise.all
function p0() {
  return new MyPromise(function (resolve, reject) {
    setTimeout(function () {
      resolve("p0");
    }, 2000);
  });
}

function p2() {
  return new MyPromise(function (resolve, reject) {
    resolve("p2");
  });
}

MyPromise.all(["a", "b", p0(), p2(), "c"]).then(function (res) {
  console.log(res.length);
  console.log(res); // ['a', 'b', 'p0', 'p2', 'c']
});
// function p0() {
//   return new Promise(function (resolve, reject) {
//     setTimeout(function () {
//       resolve("p0");
//     }, 2000);
//   });
// }

// function p2() {
//   return new Promise(function (resolve, reject) {
//     resolve("p2");
//   });
// }

// Promise.all(["a", "b", p0(), p2(), "c"]).then(function (res) {
//   console.log(res); // ['a', 'b', 'p0', 'p2', 'c']
// });

MyPromise.resolve(100).then((value) => console.log(value));
MyPromise.resolve(p0()).then((value) => console.log(value));

// finally
